home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1985-08-27 | 14.6 KB | 603 lines |
- 10 ' ADVENTURE INTERPRETER 2.1
- 15 '
- 20 ' last revision 3/1/83 by JRC
- 25 '
- 30 ' This program must be run with the version 2.1 compiler and is not
- 35 ' compatible with version 2.0 which was a straight copy of version 1.2.
- 40 ' This version uses different files.
- 45 '
- 50 ' Peter F. Levy Jim R. Cummins
- 60 ' 4209 Longmeadow Way 5 Jacob St.
- 70 ' Ft. Worth, TX 76133 Ballston Lake, NY 12019
- 80 ' (817) 292-8731 CompuServe [72155,1174]
- 90 '
- 100 KEY OFF:DEFINT A-Z:DEF SEG=0:WTH=PEEK(&H410) AND &H30:DEF SEG:FALSE=0:TRUE=NOT FALSE
- 110 IF WTH=&H30 THEN WTH=80:CGCARD=FALSE:FGD=7:BGD=0:BRD=0 ELSE CGCARD=TRUE:FGD=6:BGD=1:BRD=1:IF WTH=&H20 THEN WTH=80 ELSE WTH=40
- 120 SCREEN 0,ABS(CGCARD),0,0:COLOR FGD,BGD,BRD:WIDTH WTH:CLS
- 130 PRINT"ADVENTURE SYSTEM DATABASE INTERPRETER 2.1"
- 140 PRINT
- 150 PRINT"Written by Peter F. Levy":PRINT TAB(12)"4209 Longmeadow Way"
- 160 PRINT TAB(12)"Fort Worth, TX 76133":PRINT TAB(12)"(817) 292-8731"
- 170 PRINT:PRINT"Adapted and modified for the":PRINT"<<<IBM Personal Computer>>> by"
- 180 PRINT TAB(12)"Jim R. Cummins":PRINT TAB(12)"5 Jacob St."
- 190 PRINT TAB(12)"Ballston Lake, NY 12019":PRINT TAB(12)"CompuServe [72155,1174]":PRINT
- 200 MASK(0)=1:MASK(1)=2:MASK(2)=4:MASK(3)=8:MASK(4)=&H10:MASK(5)=&H20:MASK(6)=&H40:MASK(7)=&H80:MASK(8)=&H100:MASK(9)=&H200:MASK(10)=&H400
- 220 DEF FNX(AS$,K)=ASC(MID$(AS$,K,1))
- 225 DEF FNUPCS$(A$)=CHR$(ASC(A$)+32*(ASC(A$)>96 AND ASC(A$)<123))
- 230 DEF FNL(X)=ASC(OB$(X))
- 240 DEF FNZ(X)=-(X AND 127)
- 250 DEF FNW(X)=ASC(MID$(OB$(X),3,1))
- 260 ON ERROR GOTO 30000
- 270 LINE INPUT "Adventure name ";F$
- 275 I=INSTR(F$,"."):IF I>0 THEN F$=LEFT$(F$,I-1)
- 280 OPEN "I",2,F$+".DAT"
- 285 OPEN "R",1,F$+".REF",32
- 290 FIELD #1,32 AS AI$
- 295 CLS:PRINT TAB(15)"One moment please..."
- 300 SP$=" ":LF$=CHR$(10):REND$=STRING$(32,255)
- 305 GET#1,2
- 306 NVERBS=ASC(MID$(AI$,1,1)):NNOUNS=ASC(MID$(AI$,2,1)):NOBJ=ASC(MID$(AI$,3,1))
- 307 NROOM=ASC(MID$(AI$,4,1)):NMESG=ASC(MID$(AI$,5,1)):NAUTO=ASC(MID$(AI$,6,1))
- 308 NACT=256*ASC(MID$(AI$,7,1))+ASC(MID$(AI$,8,1))
- 309 AMAX=256*ASC(MID$(AI$,9,1))+ASC(MID$(AI$,10,1))
- 310 DIM OB$(NOBJ),RM$(NROOM),VS$(8),NS$(8),BF(32),C(255),AA$(NAUTO+1)
- 315 RM.INC=NOBJ:MSG.INC=RM.INC+NROOM:ACT.INC=MSG.INC+NMESG
- 320 DIM NDX(AMAX+ACT.INC+1)
- 400 INPUT #2,A$:IF RIGHT$(A$,1)=CHR$(255) THEN PRINT A$;:GOTO 450 ELSE IF (POS(0)+LEN(A$))>WTH THEN PRINT
- 440 PRINT A$;:GOTO 400
- 450 FOR I=1 TO 8:VS$(I)=INPUT$(255,#2):NEXT:VL$=INPUT$(255,#2)
- 460 FOR I=1 TO 8:NS$(I)=INPUT$(255,#2):NEXT:NL$=INPUT$(255,#2)
- 470 FOR I=1 TO 255
- 480 A$=INPUT$(32,#2):IF A$=REND$ THEN OB$(I)=CHR$(255):NOB=I:GOTO 510
- 490 OB$(I)=A$
- 500 IF RIGHT$(OB$(I),1)=" " THEN OB$(I)=LEFT$(OB$(I),LEN(OB$(I))-1):GOTO 500
- 505 NEXT I
- 510 FOR J=1 TO NOB-1:IF ASC(OB$(J))=255 THEN LD=LD+ASC(MID$(OB$(J),3,1))
- 520 NEXT J
- 525 IF NOB<>NOBJ THEN PRINT "ERROR - Object number mismatch";NOB;NOBJ:END
- 530 CR=ASC(INPUT$(1,#2))
- 540 FOR I=1 TO 255
- 550 A$=INPUT$(32,#2)
- 560 IF A$=REND$ THEN RM$(I)=CHR$(255):NRM=I:GOTO 575
- 570 RM$(I)=A$ : NEXT I
- 575 IF NRM<>NROOM THEN PRINT "ERROR - Room number mismatch";NRM;NROOM:END
- 580 FOR I=1 TO 255
- 590 AA$(I)=INPUT$(1,#2):IF AA$(I)=CHR$(255) THEN NAA=I:GOTO 615
- 600 WHILE A$>CHR$(0) :A$=INPUT$(1,#2)
- 610 AA$(I)=AA$(I)+A$:WEND:NEXT
- 615 IF NAA<>NAUTO THEN PRINT"ERROR - Auto Action number mismatch";NAA;NAUTO:END
- 620 FOR I=1 TO NOBJ:INPUT#2,NDX(I):NEXT
- 630 FOR I=1 TO NROOM:INPUT#2,NDX(I+RM.INC):NEXT
- 640 FOR I=1 TO NMESG:INPUT#2,NDX(I+MSG.INC):NEXT
- 650 FOR I=1 TO AMAX:INPUT#2,NDX(I+ACT.INC):NEXT
- 660 CLOSE #2
- 670 RE$=STRING$(255,"N")
- 680 HE=100:LS=TRUE
- 690 UW$=" A AN AT TO THE WITH IN ON SOME OFF OF INTO "
- 700 LOCATE 25,5:PRINT"[Depress space bar to begin play.]";
- 710 A$=INKEY$: IF A$<>" " THEN 710
- 720 CLS
- 1000 '
- 1010 ' UPDATE SCREEN DISPLAY
- 1020 ' ---------------------
- 1030 IF LS=FALSE AND R1<>CR THEN PRINT"It's too dark to see anything.":GOTO 2000
- 1040 IF R1<>CR THEN PRINT MID$(RM$(CR),7,25)
- 1050 IF MID$(RE$,CR,1)="Y" THEN 1100
- 1060 Z=CR+RM.INC:X=FIX(NDX(Z)/8):N=NDX(Z)-X*8
- 1070 RM$="":FOR I=0 TO N:GET #1,X+I:RM$=RM$+AI$:NEXT I
- 1080 IF RIGHT$(RM$,1)=" " THEN RM$=LEFT$(RM$,LEN(RM$)-1):GOTO 1080
- 1090 PRINT RM$;:MID$(RE$,CR,1)="Y"
- 1100 IF R1=CR THEN 2000
- 1110 FOR I=1 TO 255
- 1120 IF OB$(I)=CHR$(255) THEN I=255: GOTO 1170
- 1130 IF FNL(I)<>CR THEN 1170
- 1140 X=FIX(NDX(I)/8):N=NDX(I)-8*X
- 1150 FOR J=0 TO N:GET #1,X+J
- 1160 PRINT AI$;:NEXT J:PRINT
- 1170 NEXT I
- 1180 R1=CR
- 2000 '
- 2010 ' CARRY OUT IMPLICIT ACTIVITY
- 2020 ' ---------------------------
- 2030 M=0
- 2040 M=M+1
- 2050 IF AA$(M)=CHR$(255) OR M=NAA+1 THEN 3000
- 2060 AS$=AA$(M)
- 2070 GOSUB 10000
- 2080 GOTO 2040
- 3000 '
- 3010 ' DO LOWER SCREEN DISPLAY
- 3020 ' -----------------------
- 3040 YPOS=CSRLIN
- 3050 XPOS=POS(X)
- 3060 LOCATE 25,1,0:PRINT"Location:";MID$(RM$(CR),7,64);
- 3070 MV$=""
- 3080 FOR Z=1 TO 6
- 3090 IF ASC(MID$(RM$(CR),Z,1))>0 THEN MV$=MV$+MID$("NSEWUD",Z,1)
- 3100 NEXT Z:PRINT USING" Exits: \ \";MV$;
- 3110 PRINT USING"Load:##\\Moves:#### Score:###";LD;CHR$(37);C(0);SC;
- 3120 LOCATE YPOS,XPOS,1
- 4000 '
- 4010 ' GET USER INPUT, PARSE VERB AND NOUN
- 4020 ' -----------------------------------
- 4030 V$=CHR$(0)
- 4040 N$=CHR$(0)
- 4050 O$=CHR$(0)
- 4060 V=0
- 4070 N=1
- 4080 O=0
- 4090 NL=0
- 4100 LINE INPUT ">";CO$:IF CO$="" THEN PRINT "Hello?":GOTO 3000
- 4110 C1$=CO$:FOR M=1 TO LEN(CO$):MID$(C1$,M,1)=FNUPCS$(MID$(CO$,M,1)):NEXT M
- 4140 IF LEN(C1$)=1 THEN 4600
- 4150 GOSUB 4500: V$=W$
- 4160 IF C1$>"" THEN GOSUB 4500: N$=W$
- 4170 IF C1$>"" THEN GOSUB 4500: O$=W$
- 4180 IF LEN(V$)>9 THEN V$=LEFT$(V$,9)
- 4190 IF LEN(N$)>9 THEN N$=LEFT$(N$,9)
- 4200 IF LEN(O$)>9 THEN O$=LEFT$(O$,9)
- 4210 C1$=CO$:GOSUB 4500:VI$=W$:I=1
- 4220 J=INSTR(VS$(I)," "+V$+" ")
- 4230 IF J=0 AND I<8 THEN I=I+1:GOTO 4220
- 4240 IF J>0 AND I<9 THEN V=1+FIX(J/10)+25*(I-1)
- 4250 IF V=0 THEN PRINT "I don't know how to ";VI$;".":GOTO 3000
- 4260 VL=ASC(MID$(VL$,V,1))-32:IF VL>0 THEN V=VL
- 4270 IF N$=CHR$(0) THEN 4400
- 4280 GOSUB 4500:NI$=W$:I=1
- 4290 J=INSTR(NS$(I)," "+N$+" ")
- 4300 IF J=0 AND I<8 THEN I=I+1:GOTO 4290
- 4310 IF J>0 AND I<9 THEN N=1+FIX(J/10)+25*(I-1)
- 4320 IF N>0 THEN NL=ASC(MID$(NL$,N,1))-32
- 4330 IF O$=CHR$(0) THEN 4400
- 4340 GOSUB 4500:OI$=W$:I=1
- 4350 J=INSTR(NS$(I)," "+O$+" ")
- 4360 IF J=0 AND I<8 THEN I=I+1: GOTO 4350
- 4370 IF J>0 AND I<9 THEN O=1+FIX(J/10)+25*(I-1)
- 4380 IF O>0 THEN NO=ASC(MID$(NL$,N,1))-32
- 4400 Z=NNOUNS*V+N+ACT.INC:Y=FIX(NDX(Z)/8)
- 4410 IF Y>0 THEN 4450
- 4420 IF N>1 THEN N=1: GOTO 4400
- 4430 ON V GOTO 24000,25000,21000
- 4440 PRINT "I don't know how to ";CO$;".": GOTO 3000
- 4450 N=NDX(Z)-8*Y:AS$="":FOR I=0 TO N:GET #1,Y+I
- 4460 AS$=AS$+AI$:NEXT I
- 4470 I=INSTR(AS$,CHR$(0)):AS$=LEFT$(AS$,I)
- 4490 GOTO 5000
- 4500 ' EXTRACT NEXT WORD
- 4510 IF C1$="" THEN W$=CHR$(0):GOTO 4570
- 4520 I=INSTR(C1$," ")
- 4530 IF I=0 THEN W$=C1$:C1$="":GOTO 4570
- 4540 W$=LEFT$(C1$,I-1)
- 4550 C1$=MID$(C1$,I+1,255)
- 4560 IF INSTR(UW$," "+W$+" ") THEN 4500
- 4570 RETURN
- 4600 ' SINGLE-CHR INPUT
- 4610 ON INSTR("IL",C1$) GOTO 22000,23000
- 4620 I=INSTR("NSEWUD",C1$)
- 4630 IF I=0 THEN PRINT "Huh?":GOTO 3000
- 4640 V=3:N=1:GOTO 4430
- 5000 '
- 5010 ' CARRY OUT ASSIGNED ACTIONS
- 5020 ' --------------------------
- 5030 C(0)=C(0)+1
- 5040 AF=0
- 5050 GOSUB 10000
- 5060 IF AF=0 THEN PRINT "That isn't possible under the circumstances."
- 5070 GOTO 1000
- 10000 '
- 10002 ' ACT UPON ACTION STRING
- 10004 ' ----------------------
- 10006 K=0:T=TRUE:TR=TRUE
- 10010 K=K+1
- 10014 IF K>LEN(AS$) THEN RETURN
- 10016 TN=ASC(MID$(AS$,K,1))
- 10020 F=(TN>127):TN=(TN AND 127):IF TN=0 THEN RETURN
- 10028 RF = ((NOT TR) AND (NOT F)) OR (TR AND F)
- 10030 A=FIX(TN/10)+1:B=TN-10*A+11
- 10034 ON A GOTO 10038,10040,10042,10044,10046,10048,10098,10098,10098
- 10036 ON A GOTO 10098,10098,10098,10098
- 10038 ON B-1 GOTO 10100,10200,10300,10400,10500,10600,10700,10800,10900
- 10040 ON B GOTO 11000,11100,11200,11300,11400,11500,11600,11700,11800,11900
- 10042 ON B GOTO 12000,12100,12200,12300,12400,12500,12600,12700,12800,12900
- 10044 ON B GOTO 13000,13100,13200,13300,13400,13500,13600,13700,13800,13900
- 10046 ON B GOTO 14000,14100,14200,14300,14400,14500,14600,14700,14800,14900
- 10048 ON B GOTO 15000,15100,15200,15300,15400,15500,15600,15700,15800
- 10098 PRINT "Undefined token encountered:";TN:GOTO 10010
- 10100 ' HASX X
- 10110 K=K+1:X=FNX(AS$,K)
- 10120 T=(FNL(X)=255)
- 10130 GOTO 26000
- 10200 ' NCRX X
- 10210 K=K+1:X=FNX(AS$,K)
- 10220 T=(FNL(X)=CR)
- 10230 GOTO 26000
- 10300 ' AVLX X
- 10310 K=K+1:X=FNX(AS$,K)
- 10320 T=((FNL(X)=255) OR (FNL(X)=CR))
- 10330 GOTO 26000
- 10400 ' XINY X Y
- 10410 K=K+1:X=FNX(AS$,K)
- 10420 K=K+1:Y=FNX(AS$,K)
- 10430 T=(FNL(X)=Y)
- 10440 GOTO 26000
- 10500 ' NSRX X
- 10510 K=K+1:X=FNX(AS$,K)
- 10520 T=(FNL(X)=ASC(MID$(OB$(X),2,1)))
- 10530 GOTO 26000
- 10600 ' NR0X X
- 10610 K=K+1:X=FNX(AS$,K)
- 10620 T=(FNL(X)=0)
- 10630 GOTO 26000
- 10700 ' XW/Y X Y
- 10710 K=K+1:X=FNX(AS$,K)
- 10720 K=K+1:Y=FNX(AS$,K)
- 10730 T=(FNL(X)=FNL(Y))
- 10740 GOTO 26000
- 10800 ' HASL
- 10810 T=(FNL(NL)=255)
- 10820 GOTO 26000
- 10900 ' NCRL
- 10910 T=(FNL(NL)=CR)
- 10920 GOTO 26000
- 11000 ' AVLL
- 11010 T=(FNL(NL)=CR OR FNL(NL)=255)
- 11020 GOTO 26000
- 11100 ' LINX X
- 11110 K=K+1:X=FNX(AS$,K)
- 11120 T=(FNL(NL)=X)
- 11130 GOTO 26000
- 11200 ' NSRL
- 11210 T=(FNL(NL)=ASC(MID$(OB$(NL),2,1)))
- 11220 GOTO 26000
- 11300 ' NR0L
- 11310 K=K+1:X=FNX(AS$,K)
- 11320 T=(FNL(NL)=0)
- 11330 GOTO 26000
- 11400 ' LW/X X
- 11410 K=K+1:X=FNX(AS$,K)
- 11420 T=(FNL(NL)=FNL(X))
- 11430 GOTO 26000
- 11500 ' RAND X
- 11510 K=K+1:X=FNX(AS$,K)
- 11520 T=(100*RND<=X)
- 11530 GOTO 26000
- 11600 ' CEQN #C N
- 11610 K=K+1:C=FNX(AS$,K)
- 11620 K=K+1:N=FNX(AS$,K)
- 11630 T=(C(C)=N)
- 11640 GOTO 26000
- 11700 ' CGEN #C N
- 11710 K=K+1:C=FNX(AS$,K)
- 11720 K=K+1:N=FNX(AS$,K)
- 11730 T=(C(C)>=N)
- 11740 GOTO 26000
- 11800 ' CEQC #C #D
- 11810 K=K+1:C=FNX(AS$,K)
- 11820 K=K+1:D=FNX(AS$,K)
- 11830 T=(C(C)=C(D))
- 11840 GOTO 26000
- 11900 ' CGEC #C #D
- 11910 K=K+1:C=FNX(AS$,K)
- 11920 K=K+1:D=FNX(AS$,K)
- 11930 T=(C(C)>=C(D))
- 11940 GOTO 26000
- 12000 ' XSET N
- 12010 K=K+1: X=FNX(AS$,K)
- 12020 FB=FIX(X/8)
- 12030 T=((BF(FB) AND MASK(X))>0)
- 12040 GOTO 26000
- 12100 ' INRX X
- 12110 K=K+1:X=FNX(AS$,K)
- 12120 T=(CR=X)
- 12130 GOTO 26000
- 12200 ' LIGH
- 12210 T=LS
- 12220 GOTO 26000
- 12300 ' LDGT X
- 12310 K=K+1:X=FNX(AS$,K)
- 12320 T=(LD>X)
- 12330 GOTO 26000
- 12400 ' OBJ= X
- 12410 K=K+1:X=FNX(AS$,K)
- 12420 T=(X=NO)
- 12430 GOTO 26000
- 12500 ' X2RY X Y
- 12510 K=K+1:X=FNX(AS$,K)
- 12520 K=K+1:Y=FNX(AS$,K)
- 12530 IF RF THEN 10010 ELSE AF=1
- 12540 IF FNL(X)<255 AND Y=255 THEN LD=LD+FNW(X)
- 12550 IF FNL(X)=255 AND Y<255 THEN LD=LD-FNW(X)
- 12560 MID$(OB$(X),1,1)=CHR$(Y)
- 12570 GOTO 10010
- 12600 ' X2OY X Y
- 12610 K=K+1:X=FNX(AS$,K)
- 12620 K=K+1:Y=FNX(AS$,K)
- 12630 IF RF THEN 10010 ELSE AF=1
- 12640 IF FNL(X)<255 AND FNL(Y)=255 THEN LD=LD+FNW(X)
- 12650 IF FNL(X)=255 AND FNL(Y)<255 THEN LD=LD-FNW(X)
- 12660 MID$(OB$(X),1,1)=LEFT$(OB$(Y),1)
- 12670 GOTO 10010
- 12700 ' X2CR X
- 12710 K=K+1:X=FNX(AS$,K)
- 12720 IF RF THEN 10010 ELSE AF=1
- 12730 IF FNL(X)=255 THEN LD=LD-FNW(X)
- 12740 MID$(OB$(X),1,1)=CHR$(CR)
- 12750 GOTO 10010
- 12800 ' X2SR X
- 12810 K=K+1:X=FNX(AS$,K)
- 12820 IF RF THEN 10010 ELSE AF=1
- 12830 IF FNL(X)=255 THEN LD=LD-FNW(X)
- 12840 MID$(OB$(X),1,1)=MID$(OB$(X),2,1)
- 12850 GOTO 10010
- 12900 ' X2R0 X
- 12910 K=K+1:X=FNX(AS$,K)
- 12920 IF RF THEN 10010 ELSE AF=1
- 12930 IF FNL(X)=255 THEN LD=LD-FNW(X)
- 12940 MID$(OB$(X),1,1)=CHR$(0)
- 12950 GOTO 10010
- 13000 ' X<>Y X Y
- 13010 K=K+1:X=FNX(AS$,K)
- 13020 K=K+1:Y=FNX(AS$,K)
- 13030 IF RF THEN 10010 ELSE AF=1
- 13040 IF FNL(X)<255 AND FNL(Y)=255 THEN LD=LD+FNW(X)-FNW(Y)
- 13050 IF FNL(X)=255 AND FNL(Y)<255 THEN LD=LD-FNW(X)+FNW(X)
- 13060 L$=CHR$(FNL(X))
- 13070 MID$(OB$(X),1,1)=LEFT$(OB$(Y),1)
- 13080 MID$(OB$(Y),1,1)=L$
- 13090 GOTO 10010
- 13100 ' L2RX X
- 13110 K=K+1:X=FNX(AS$,K)
- 13120 IF RF THEN 10010 ELSE AF=1
- 13130 IF FNL(NL)<255 AND X=255 THEN LD=LD+FNW(NL)
- 13140 IF FNL(NL)=255 AND X<255 THEN LD=LD-FNW(NL)
- 13150 MID$(OB$(NL),1,1)=CHR$(X)
- 13160 GOTO 10010
- 13200 ' L2OX X
- 13210 K=K+1:X=FNX(AS$,K)
- 13220 IF RF THEN 10010 ELSE AF=1
- 13230 IF FNL(NL)<255 AND X=255 THEN LD=LD+FNW(NL)
- 13240 IF FNL(NL)=255 AND X<255 THEN LD=LD-FNW(NL)
- 13250 MID$(OB$(NL),1,1)=LEFT$(OB$(X),1)
- 13260 GOTO 10010
- 13300 ' L2CR
- 13310 IF RF THEN 10010 ELSE AF=1
- 13320 IF FNL(NL)=255 THEN LD=LD-FNW(NL)
- 13330 MID$(OB$(NL),1,1)=CHR$(CR)
- 13340 GOTO 10010
- 13400 ' L2SR
- 13410 IF RF THEN 10010 ELSE AF=1
- 13420 IF FNL(NL)=255 AND MID$(OB$(X),2,1)<>255 THEN LD=LD-FNW(NL)
- 13430 MID$(OB$(NL),1,1)=MID$(OB$(NL),2,1)
- 13440 GOTO 10010
- 13500 ' L2R0
- 13510 IF RF THEN 10010 ELSE AF=1
- 13520 IF FNL(NL)=255 THEN LD=LD-FNW(NL)
- 13530 MID$(OB$(NL),1,1)=CHR$(0)
- 13540 GOTO 26000
- 13600 ' L<>X X
- 13610 K=K+1:X=FNX(AS$,K)
- 13620 IF RF THEN 10010 ELSE AF=1
- 13630 IF FNL(NL)=255 AND FNL(X)<255 THEN LD=LD-FNW(NL)+FNW(X)
- 13640 IF FNL(NL)<255 AND FNL(X)=255 THEN LD=LD+FNW(NL)-FNW(X)
- 13650 L$=LEFT$(OB$(NL),1)
- 13660 MID$(OB$(NL),1,1)=LEFT$(OB$(X),1)
- 13670 MID$(OB$(X),1,1)=L$
- 13680 GOTO 10010
- 13700 ' DROP
- 13710 IF RF THEN 10010 ELSE AF=1
- 13720 FOR Z=1 TO NOB
- 13740 IF FNL(Z)<255 THEN 13770
- 13750 MID$(OB$(Z),1,1)=CHR$(CR)
- 13760 LD=LD-FNW(Z)
- 13770 NEXT Z
- 13780 GOTO 10010
- 13800 ' P2RX X
- 13810 K=K+1:X=FNX(AS$,K)
- 13820 IF RF THEN 10010 ELSE AF=1
- 13830 CR=X
- 13840 GOTO 10010
- 13900 ' P2OX X
- 13910 K=K+1:X=FNX(AS$,K)
- 13920 IF RF THEN 10010 ELSE AF=1
- 13930 CR=FNL(X)
- 13940 GOTO 10010
- 14000 ' SCO+ X
- 14010 K=K+1:X=FNX(AS$,K)
- 14020 IF RF THEN 10010 ELSE AF=1
- 14030 IF X>127 THEN X=FNZ(X)
- 14040 SC=SC+X
- 14050 GOTO 10010
- 14100 ' HEAL X
- 14110 K=K+1:X=FNX(AS$,K)
- 14120 IF RF THEN 10010 ELSE AF=1
- 14130 IF X>127 THEN X=FNZ(X)
- 14140 HE=HE+X
- 14150 IF HE>100 THEN HE=100
- 14160 IF HE<0 THEN HE=0
- 14170 GOTO 10010
- 14200 ' CTX+ #C Y
- 14210 K=K+1:C=FNX(AS$,K)
- 14220 K=K+1:Y=FNX(AS$,K)
- 14230 IF RF THEN 10010 ELSE AF=1
- 14240 IF Y>127 THEN Y=FNZ(Y)
- 14250 C(C)=C(C)+Y
- 14260 GOTO 10010
- 14300 ' CTX= #C Y
- 14310 K=K+1:C=FNX(AS$,K)
- 14320 K=K+1:Y=FNX(AS$,K)
- 14330 IF RF THEN 10010 ELSE AF=1
- 14340 IF Y>127 THEN Y=FNZ(Y)
- 14350 C(C)=Y
- 14360 GOTO 10010
- 14400 ' SETX X
- 14410 K=K+1:X=FNX(AS$,K)
- 14420 IF RF THEN 10010 ELSE AF=1
- 14430 FB=FIX(X/8)
- 14440 BF(FB)=(BF(FB) OR MASK(X))
- 14450 GOTO 10010
- 14500 ' CLRX X
- 14510 K=K+1:X=FNX(AS$,K)
- 14520 IF RF THEN 10010 ELSE AF=1
- 14530 FB=FIX(X/8)
- 14540 BF(FB)=(BF(FB) AND (NOT MASK(X)))
- 14550 GOTO 10010
- 14600 ' MSGX X
- 14610 K=K+1:X=FNX(AS$,K)
- 14620 IF RF THEN 10010 ELSE AF=1
- 14630 Z=X+MSG.INC:Y=FIX(NDX(Z)/8):N=NDX(Z)-8*Y
- 14640 MSG$="":FOR I=0 TO N:GET #1,Y+I:MSG$=MSG$+AI$:NEXT I
- 14650 IF RIGHT$(MSG$,1)=" " THEN MSG$=LEFT$(MSG$,LEN(MSG$)-1):GOTO 14650
- 14660 PRINT MSG$;:GOTO 10010
- 14700 ' ENDG
- 14710 IF RF THEN 10010 ELSE AF=1
- 14720 PRINT "The game is over. Your final score is";STR$(SC);"."
- 14740 ON ERROR GOTO 0
- 14750 CLOSE
- 14770 END
- 14800 ' LMP1
- 14810 IF RF THEN 10010 ELSE AF=1
- 14820 LS=TRUE
- 14830 GOTO 10010
- 14900 ' LMP0
- 14910 IF RF THEN 10010 ELSE AF=1
- 14920 LS=FALSE
- 14930 GOTO 10010
- 15000 ' DIAG
- 15010 IF RF THEN 10010 ELSE AF=1
- 15020 PRINT "You feel ";
- 15030 ON 1+FIX((HE-1)/20) GOTO 15040,15050,15060,15070,15080
- 15040 PRINT "just plain awful.": GOTO 10010
- 15050 PRINT "lousy.": GOTO 10010
- 15060 PRINT "a bit poorly.": GOTO 10010
- 15070 PRINT "pretty well.": GOTO 10010
- 15080 PRINT "just fine.": GOTO 10010
- 15100 ' WAIT X
- 15110 K=K+1:X=FNX(AS$,K)
- 15120 IF RF THEN 10010 ELSE AF=1
- 15130 FOR Z=1 TO X/250: NEXT
- 15140 GOTO 26000
- 15200 ' ECHO
- 15210 IF RF THEN 10010 ELSE AF=1
- 15220 PRINT " "CO$" ";
- 15230 GOTO 26000
- 15300 ' RPTV
- 15310 IF RF THEN 10010 ELSE AF=1
- 15320 PRINT " "VI$" ";
- 15330 GOTO 26000
- 15400 ' RPTN
- 15410 IF RF THEN 10010 ELSE AF=1
- 15420 PRINT " "NI$" ";
- 15430 GOTO 26000
- 15500 ' RPTO
- 15510 IF RF THEN 10010 ELSE AF=1
- 15520 PRINT " "OI$" ";
- 15530 GOTO 26000
- 15600 ' ELSE
- 15610 IF TR THEN RETURN
- 15620 TR=TRUE
- 15630 GOTO 10010
- 15700 ' SAVE
- 15710 IF RF THEN 10010 ELSE AF=1
- 15720 LINE INPUT "Save file";FL$:IF FL$="" THEN PRINT"No Save file given. Save not done.":GOTO 26000
- 15730 IF INSTR(FL$,".")=0 THEN FL$=FL$+".SAV"
- 15735 OPEN "O",3,FL$
- 15740 WRITE #3,WT,HS,LS,CR,LD,SC,RE$
- 15750 FOR I=0 TO 32:WRITE #3,BF(I):NEXT
- 15760 FOR I=0 TO 255: WRITE #3,C(I):NEXT
- 15770 FOR I=0 TO NOB:WRITE #3,ASC(OB$(I)):NEXT
- 15780 CLOSE #3
- 15790 GOTO 26000
- 15800 ' LOAD
- 15810 IF RF THEN 10010 ELSE AF=1
- 15820 LINE INPUT "Load file";FL$:IF FL$="" THEN PRINT "No Load file given. Restore not done.":GOTO 26000
- 15830 IF INSTR(FL$,".")=0 THEN FL$=FL$+".SAV"
- 15835 OPEN "I",3,FL$
- 15840 INPUT #3,WT,HS,LS,CR,LD,SC,RE$
- 15850 FOR I=0 TO 32:INPUT #3,BF(I):NEXT
- 15860 FOR I=0 TO 255:INPUT #3,C(I):NEXT
- 15870 FOR I=1 TO NOB:INPUT #3,J
- 15871 IF OB$(I)>"" THEN MID$(OB$(I),1,1)=CHR$(J)
- 15872 NEXT
- 15880 CLOSE #3
- 15890 GOTO 26000
- 20000 '
- 20010 ' DEDICATED ACTION ROUTINES
- 20020 ' -------------------------
- 21000 '
- 21010 ' HANDLE N,S,E,W,U OR D
- 21020 ' ---------------------
- 21030 IF LEN(CO$)>1 THEN CO$=LEFT$(N$,1)
- 21040 I=INSTR("NSEWUDnsewud",CO$):IF I=0 THEN 1000
- 21050 C(0)=C(0)+1:IF I>6 THEN I=I-6
- 21060 NR=ASC(MID$(RM$(CR),I,1))
- 21070 IF NR=0 THEN PRINT "No passage that way.": GOTO 1000
- 21080 CR=NR
- 21090 R1=-1
- 21100 GOTO 1000
- 22000 '
- 22010 ' HANDLE INVENTORY
- 22020 ' ----------------
- 22030 C(0)=C(0)+1
- 22040 PRINT "You are carrying:"
- 22050 K=0
- 22060 FOR Z=1 TO 255
- 22065 IF OB$(Z)=CHR$(255) THEN Z=255: GOTO 22100
- 22070 IF FNL(Z)<255 THEN 22100
- 22080 PRINT " ";MID$(OB$(Z),5,26)
- 22090 K=1
- 22100 NEXT
- 22110 IF K=0 THEN PRINT " Nothing."
- 22120 GOTO 1000
- 23000 '
- 23010 ' HANDLE LOOK
- 23020 ' -----------
- 23030 C(0)=C(0)+1
- 23040 MID$(RE$,CR,1)="N"
- 23050 R1=0
- 23060 GOTO 1000
- 24000 '
- 24010 ' HANDLE GET
- 24020 ' ----------
- 24030 C(0)=C(0)+1
- 24040 IF NL=0 THEN PRINT "You can't do that.": GOTO 1000
- 24050 IF FNL(NL)<>CR THEN PRINT "What "NI$"?": GOTO 1000
- 24060 IF FNL(NL)=255 THEN PRINT "You already have it!": GOTO 1000
- 24070 WT=ASC(MID$(OB$(NL),3,1))
- 24080 IF WT=255 THEN PRINT "You are quite incapable of moving the "NI$".": GOTO 1000
- 24090 IF LD+WT>100 THEN PRINT "You can't carry that much more weight.": GOTO 1000
- 24100 MID$(OB$(NL),1,1)=CHR$(255)
- 24110 LD=LD+ASC(MID$(OB$(NL),3,1))
- 24120 SC=SC+ASC(MID$(OB$(NL),4,1))
- 24130 PRINT "The "NI$" taken."
- 24140 GOTO 1000
- 25000 '
- 25010 ' HANDLE DROP
- 25020 ' --------------
- 25030 C(0)=C(0)+1
- 25040 IF NL=0 THEN 1000
- 25050 IF FNL(NL)<>255 THEN PRINT "You aren't carrying any ";NI$: GOTO 1000
- 25060 WT=ASC(MID$(OB$(NL),3,1))
- 25070 MID$(OB$(NL),1,1)=CHR$(CR)
- 25080 LD=LD-ASC(MID$(OB$(NL),3,1))
- 25090 SC=SC-ASC(MID$(OB$(NL),4,1))
- 25100 PRINT "The "NI$" released."
- 25110 GOTO 1000
- 26000 '
- 26010 ' UPDATE TRUTH MASK ON RETURN FROM TEST
- 26020 ' -------------------------------------
- 26030 T=(T AND NOT RF) OR (NOT T AND RF)
- 26040 TR=TR AND T
- 26050 GOTO 10010
- 30000 '
- 30010 ' ERROR TRAP
- 30020 ' ----------
- 30030 PRINT
- 30040 PRINT "<*** ERROR";ERR;"has occured in line";ERL;"***>"
- 30050 PRINT
- 30060 PRINT "Press ENTER to attempt recovery or ESC to stop run ";
- 30070 A$=INKEY$:IF A$="" THEN 30070
- 30080 IF A$=CHR$(27) THEN ON ERROR GOTO 0
- 30090 IF A$=CHR$(13) THEN RESUME 1000
- 30100 BEEP:GOTO 30070
- 50000 ' LAST LINE
-